package com.ncmmall.domain.business.goods;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.ncmmall.domain.business.goods.attribute.GoodsAttributeChannel;
import com.ncmmall.domain.business.goods.attribute.GoodsSaleAttribute;
import com.ncmmall.domain.business.goods.brand.GoodsBrand;
import com.ncmmall.domain.business.goods.channel.GoodsChannel;
import com.ncmmall.domain.business.goods.image.GoodsImage;
import com.ncmmall.domain.business.goods.params.GoodsParams;
import com.ncmmall.domain.business.goods.sku.GoodsSku;
import com.ncmmall.domain.business.goods.unit.GoodsUnit;
import com.ncmmall.domain.business.marketing.seckill.SeckillSession;
import com.ncmmall.domain.business.merchant.freight.MerchantFreightTemplate;
import com.ncmmall.domain.security.user.WebUser;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

/**
 * @author linxs
 * @Description: 商品基础信息
 * @Date: 2019-06-27 22:06
 */
@Entity
@Table(name = "mall_goods")
@Access(AccessType.FIELD)
@Getter
@Setter
public class Goods {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    /**
     * 商品编号
     */
    private String goodsNo;

    /**
     * 所属类目
     */
    @ManyToOne
    private GoodsChannel goodsChannel;

    /**
     * 所属商家/供应商
     */
    @JsonIgnore
    @ManyToOne
    private WebUser merchant;

    /**
     * 商品名称
     */
    private String name;

    /**
     * 封面图片
     */
    private String defaultImage;

    /**
     * 资质证明材料图片
     */
    private String qualificationImage;

    /**
     * 默认价格
     */
    private double defaultPrice;

    /**
     * 市场价
     */
    private double marketPrice;

    /**
     * 重量：克
     */
    private double gram;

    /**
     * 零售运费计算方式
     * 1、运费模板
     * 2、包邮
     * 3、指定运费
     */
    private int postageType;

    /**
     * 零售指定运费
     */
    private double postage;

    /**
     * 零售运费模板
     */
    @OneToOne
    private MerchantFreightTemplate freightTemplate;

    /**
     * 供应商运费计算方式
     * 1、运费模块
     * 2、包邮
     * 3、指定运费
     */
    private int supplierPostageType;

    /**
     * 供应商指定运费
     */
    private double supplierPostage;

    /**
     * 供应商运费模板
     */
    @OneToOne
    private MerchantFreightTemplate supplierFreightTemplate;

    /**
     * 是否有商品规格
     * 1、有
     * 2、否
     */
    private int haveSku;

    /**
     * 是否开启多单位
     * 1、是
     * 2、否
     */
    private int haveMultiUnit;

    /**
     * 所属最小单位
     */
    @OneToOne
    private GoodsUnit unit;

    /**
     * 附属单位
     */
    @OneToOne
    private GoodsUnit affiliatedUnit;

    /**
     * 附属单位数量
     */
    private int affiliatedUnitValue;

    /**
     * 最终单位
     */
    @OneToOne
    private GoodsUnit ultimateUnit;

    /**
     * 最终单位数量
     */
    private int ultimateUnitValue;


    /**
     * 是否供应商商品
     * 1、是
     */
    private int isSupplier;

    @OneToOne
    private GoodsAttributeChannel attributeChannel;

    /**
     * 总库存（汇总SKU组合的库存）
     */
    private int store;

    /**
     * 销量
     */
    private int salesVolume;

    /**
     * 状态
     * 1：待上架
     * 2：审核中
     * 3：审核通过（销售）
     * 4：审核拒绝
     * 5、下架
     * 6、售罄
     * 7、删除
     */
    private int status;

    /**
     * 描述
     */
    @Lob
    private String content;

    /**
     * 添加时间
     */
    private Timestamp createTime;

    /**
     * 提交申请审核时间
     */
    private Timestamp applyTime;

    /**
     * 审核时间
     */
    private Timestamp checkTime;

    /**
     * 审核备注
     */
    private String checkNote;

    /**
     * 是否推荐到首页
     */
    private boolean recommend;

    /**
     * 是否推荐到采购端首页
     */
    private boolean recommendSupplier;

    /**
     * 所属品牌
     */
    @OneToOne
    private GoodsBrand brand;

    /**
     * 商品相册
     */
    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "goodsId")
    private List<GoodsImage> images = new ArrayList<>();

    /**
     * 商品SKU组合
     */

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "goodsId")
    private List<GoodsSku> skus = new ArrayList<>();

    /**
     * 商品参数组合
     */
    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "goodsId")
    private List<GoodsParams> paramses = new ArrayList<>();

    /**
     * 商品销售规格
     */
    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "goodsId", nullable = true)
    private List<GoodsSaleAttribute> saleAttributes = new ArrayList<>();

    /**
     * 当前参与的营销活动
     * 0、普通商品
     * 1、特价活动
     * 2、秒杀活动
     * 3、预售活动
     * 4、拼团活动
     */
    private int marketingType;

    /******************* 特价活动 ************************/

    /**
     * 特价活动价格
     */
    private double bargainPrice;

    /**
     * 特价活动总库存
     */
    private int bargainStore;

    /**
     * 特价活动总销量
     */
    private int bargainSalesVolume;

    /**
     * 特价活动状态
     * 1：待审核
     * 2：审核中
     * 3：审核通过，活动未开始
     * 4：审核被拒绝
     * 5：活动开始
     * 6：活动结束
     * 7：下架
     */
    private int bargainStatus;

    /**
     * 特价活动开始时间
     */
    private String beginDateOfValidity;

    /**
     * 特价活动结束时间
     */
    private String endDateOfValidity;


    /************************* 秒杀活动 ****************************/

    /**
     * 秒杀活动价格
     */
    private double seckillPrice;

    /**
     * 秒杀活动总库存
     */
    private int seckillStore;

    /**
     * 秒杀活动总销量
     */
    private int seckillSalesVolume;

    /**
     * 秒杀活动状态
     * 1：待审核
     * 2：审核中
     * 3：审核通过，活动未开始
     * 4：审核被拒绝
     * 5：活动开始
     * 6：活动结束
     * 7：下架
     */
    private int seckillStatus;

    /**
     * 所属秒杀场次
     */
    @OneToOne
    private SeckillSession seckillSession;

    /********************预售商品*******************/

    /**
     * 预售商品订金开始支付时间
     */
    private String presellSubscriptionPayBeginTime;

    /**
     * 预售商品订金截止支付时间
     */
    private String presellSubscriptionPayEndTime;

    /**
     * 预售商品尾款开始支付时间
     */
    private String presellRetainagePayBeginTime;

    /**
     * 预售商品尾款截止支付时间
     */
    private String presellRetainagePayEndTime;

    /**
     * 预售活动状态
     * 1：待审核
     * 2：审核中
     * 3：审核通过，活动未开始
     * 4：审核被拒绝
     * 5：活动开始（定金开始支付）
     * 6：定金截止支付
     * 7：尾款开始支付
     * 8：活动结束（尾款截止支付）；
     * 9：下架
     */
    private int presellStatus;

    /**
     * 预售活动价格
     */
    private double presellPrice;

    /**
     * 预售活动总销量
     */
    private int presellSalesVolume;

    /*********************拼团*******************/

    /**
     * 拼团价格
     */
    private double groupBookingPrice;

    /**
     * 拼团库存
     */
    private int groupBookingStore;

    /**
     * 成团人数
     */
    private int groupBookingCondition;

    /**
     * 拼团人数
     */
    private int groupBookingTotal;

    /**
     * 拼团活动开始时间
     */
    private String groupBookingBeginTime;

    /**
     * 拼团活动结束时间
     */
    private String groupBookingEndTime;

    /**
     * 拼团限购数量(已作废)
     */
    private int groupBookingLimit;

    /**
     * 拼团活动总销量
     */
    private int groupBookingSalesVolume;

    /**
     * 拼团状态
     * 1：待审核
     * 2：审核中
     * 3：审核通过，活动未开始
     * 4：审核被拒绝
     * 5：活动开始
     * 6：活动结束
     * 7：下架
     */
    private int groupBookingStatus;

    /**
     * 是否一键代发商品
     * 1、是
     */
    private int isIssuingType;

    /**
     * 推荐排序时间
     */
    private Timestamp recommendTime;

    /**
     * 一键代发商品
     */
    @OneToOne
    private Goods issuingGoods;

    @JsonBackReference
    @Transient
    private String imagesData;

    @JsonBackReference
    @Transient
    private String skusData;

    @JsonBackReference
    @Transient
    private String paramsData;

    @JsonBackReference
    @Transient
    private String saleAttributeData;

    @JsonBackReference
    @Transient
    private String orderByPrice;

    @JsonBackReference
    @Transient
    private String orderByStore;

    @JsonBackReference
    @Transient
    private String orderByCreateTime;

    @JsonBackReference
    @Transient
    private String orderBySalesVolume;

    @Transient
    private boolean collect;

    @Transient
    private String date;

    /**
     * 推荐筛选用
     * 1、推荐
     * 2、不推荐
     */
    @Transient
    @JsonIgnore
    private int recommendInt;

    /**
     * 参团数量
     */
    @Transient
    private int joinGroupBookingTotal;
}
